﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GraduationProject.RDBMS
{
    public abstract class OpearteBase : IDisposable
    {

        #region 数据库事务管理
        /// <summary>
        /// 数据库连接
        /// </summary>
        protected SqlConnection m_Conn = null;
        /// <summary>
        /// 数据库事务
        /// </summary>
        protected SqlTransaction m_Transaction = null;
        /// <summary>
        /// 标识是否提交
        /// </summary>
        protected bool IsDone = true;
        /// <summary>
        /// 标识事物是否打开
        /// </summary>
        protected bool IsTransOpen = false;
        /// <summary>
        /// 构造函数
        /// </summary>
        public OpearteBase()
        {
            //m_Conn = new SqlConnection("Password=hniotzdzn2016!;Persist Security Info=True;User ID=sa;Initial Catalog=GraduationProject;Data Source=10.0.2.12");
            //m_Conn = new SqlConnection("Password=Server2016!;Persist Security Info=True;User ID=sa;Initial Catalog=GraduationProject;Data Source=127.0.0.1");
            m_Conn = new SqlConnection("Password=hniotzdzn2016!;Persist Security Info=True;User ID=sa;Initial Catalog=GraduationProject;Data Source=database.lglove1314.com");
        }
        /// <summary>
        /// 打开数据库事务
        /// </summary>
        protected void TryOpenTrans()
        {
            if (!IsTransOpen)
            {
                this.m_Conn.Open();
                m_Transaction = m_Conn.BeginTransaction();
                IsTransOpen = true;
            }
        }
        /// <summary>
        /// 事务提交
        /// </summary>
		protected void TryCommitTrans()
        {
            if (IsTransOpen)
            {
                if (IsDone)
                {
                    m_Transaction.Commit();
                }
                else
                {
                    m_Transaction.Rollback();
                }
                //在事务提交/回滚后，重置参数
                IsDone = true;
                IsTransOpen = false;
                this.m_Transaction.Dispose();
                this.m_Transaction = null;
            }
        }
        #endregion

        #region 实现IDisposable
        /// <summary>
        /// 要检测的冗余调用
        /// </summary>
        private bool disposedValue = false;
        /// <summary>
        /// 部署
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 释放托管状态(托管对象)。
                    //尝试提交事务
                    TryCommitTrans();
                    this.m_Conn.Dispose();
                }
                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。
                this.m_Transaction = null;
                this.m_Conn = null;

                disposedValue = true;
            }
        }
        // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
        // ~UserManagement() {
        //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
        //   Dispose(false);
        // }

        // 添加此代码以正确实现可处置模式。
        /// <summary>
        /// 释放
        /// </summary>
        public void Dispose()
        {
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            Dispose(true);
            // TODO: 如果在以上内容中替代了终结器，则取消注释以下行。
            // GC.SuppressFinalize(this);
        }
        #endregion
    }
}
